home *** CD-ROM | disk | FTP | other *** search
/ Internet Surfer 2.0 / Internet Surfer 2.0 (Wayzata Technology) (1996).iso / pc / text / mac / faqs.536 < prev    next >
Text File  |  1996-02-12  |  28KB  |  761 lines

  1. Frequently Asked Questions (FAQS);faqs.536
  2.  
  3.  
  4.  
  5.     Fgrep still has its uses though, and may be useful when searching
  6.     a file for a larger number of strings than egrep can handle.
  7.  
  8.       egrep = "Extended GREP"
  9.  
  10.     egrep uses fancier regular expressions than grep.  Many people
  11.     use egrep all the time, since it has some more sophisticated
  12.     internal algorithms than grep or fgrep, and is usually the
  13.     fastest of the three programs.
  14.  
  15.       cat = "CATenate"
  16.  
  17.     catenate is an obscure word meaning "to connect in a series",
  18.     which is what the "cat" command does to one or more files.  Not
  19.     to be confused with C/A/T, the Computer Aided Typesetter.
  20.  
  21.       gecos = "General Electric Comprehensive Operating System"
  22.     
  23.     When GE's large systems division was sold to Honeywell,
  24.     Honeywell dropped the "E" from "GECOS".
  25.  
  26.     Unix's password file has a "pw_gecos" field.  The name is a
  27.     real holdover from the early days.  Dennis Ritchie has reported:
  28.  
  29.         "Sometimes we sent printer output or batch jobs
  30.          to the GCOS machine.  The gcos field in the password file
  31.          was a place to stash the information for the $IDENT card.
  32.          Not elegant."
  33.  
  34.       nroff = "New ROFF"
  35.       troff = "Typesetter new ROFF"
  36.     
  37.     These are descendants of "roff", which was a re-implementation
  38.     of the Multics "runoff" program (a program that you'd use to
  39.     "run off" a good copy of a document).
  40.  
  41.       tee       = T
  42.  
  43.     From plumbing terminology for a T-shaped pipe splitter.
  44.  
  45.       bss = "Block Started by Symbol"
  46.     
  47.     Dennis Ritchie says:
  48.  
  49.         Actually the acronym (in the sense we took it up; it may
  50.         have other credible etymologies) is "Block Started by
  51.         Symbol." It was a pseudo-op in FAP (Fortran Assembly [-er?]
  52.         Program), an assembler for the IBM 704-709-7090-7094
  53.         machines.  It defined its label and set aside space for a
  54.         given number of words.  There was another pseudo-op, BES,
  55.         "Block Ended by Symbol" that did the same except that the
  56.         label was defined by the last assigned word + 1.  (On these
  57.         machines Fortran arrays were stored backwards in storage
  58.         and were 1-origin.)
  59.  
  60.         The usage is reasonably appropriate, because just as with
  61.         standard Unix loaders, the space assigned didn't have to be
  62.         punched literally into the object deck but was represented
  63.         by a count somewhere.
  64.  
  65.       biff = "BIFF"
  66.  
  67.     This command, which turns on asynchronous mail notification,
  68.     was actually named after a dog at Berkeley.
  69.  
  70.         I can confirm the origin of biff, if you're interested.
  71.         Biff was Heidi Stettner's dog, back when Heidi (and I, and
  72.         Bill Joy) were all grad students at U.C. Berkeley and the
  73.         early versions of BSD were being developed.   Biff was
  74.         popular among the residents of Evans Hall, and was known
  75.         for barking at the mailman, hence the name of the command.
  76.  
  77.     Confirmation courtesy of Eric Cooper, Carnegie Mellon University
  78.  
  79.       rc (as in ".cshrc" or "/etc/rc") = "RunCom"
  80.  
  81.     "rc" derives from "runcom", from the MIT CTSS system, ca. 1965.
  82.  
  83.         'There was a facility that would execute a bunch of
  84.         commands stored in a file; it was called "runcom" for "run
  85.         commands", and the file began to be called "a runcom."
  86.  
  87.         "rc" in Unix is a fossil from that usage.'
  88.     
  89.     Brian Kernighan & Dennis Ritchie, as told to Vicki Brown
  90.  
  91.     "rc" is also the name of the shell from the new Plan 9
  92.     operating system.
  93.  
  94.       Perl = "Practical Extraction and Report Language"
  95.  
  96.     The Perl language is Larry Wall's highly popular
  97.     freely-available completely portable text, process, and file
  98.     manipulation tool that bridges the gap between shell and C
  99.     programming (or between doing it on the command line and
  100.     pulling your hair out).  For further information, see the
  101.     Usenet newsgroup comp.lang.perl.
  102.  
  103.       Don Libes' book "Life with Unix" contains lots more of these
  104.       tidbits.
  105.  
  106. 1.4)  How does the gateway between "comp.unix.questions" and the
  107.       "info-unix" mailing list work?
  108.  
  109.       "info-unix" and "unix-qizards" are mailing list versions of
  110.       comp.unix.questions and comp.unix.wizards respectively.
  111.       There should be no difference in content between the
  112.       mailing list and the newsgroup.
  113.  
  114.       To get on or off either of these lists, send mail to
  115.       info-unix-request@brl.mil or unix-wizards-request@brl.mil.
  116.       Be sure to use the '-Request'.  Don't expect an immediate response.
  117.  
  118.       Here are the gory details, courtesy of the list's maintainer,
  119.       Bob Reschly.
  120.  
  121.       ==== postings to info-UNIX and UNIX-wizards lists ====
  122.  
  123.       Anything submitted to the list is posted; I do not moderate
  124.       incoming traffic -- BRL functions as a reflector.  Postings
  125.       submitted by Internet subscribers should be addressed to the list
  126.       address (info-UNIX or UNIX- wizards);  the '-request' addresses
  127.       are for correspondence with the list maintainer [me].  Postings
  128.       submitted by USENET readers should be addressed to the
  129.       appropriate news group (comp.unix.questions or
  130.       comp.unix.wizards).
  131.  
  132.       For Internet subscribers, received traffic will be of two types;
  133.       individual messages, and digests.  Traffic which comes to BRL
  134.       from the Internet and BITNET (via the BITNET-Internet gateway) is
  135.       immediately resent to all addressees on the mailing list.
  136.       Traffic originating on USENET is gathered up into digests which
  137.       are sent to all list members daily.
  138.  
  139.       BITNET traffic is much like Internet traffic.  The main
  140.       difference is that I maintain only one address for traffic
  141.       destined to all BITNET subscribers. That address points to a list
  142.       exploder which then sends copies to individual BITNET
  143.       subscribers.  This way only one copy of a given message has to
  144.       cross the BITNET-Internet gateway in either direction.
  145.  
  146.       USENET subscribers see only individual messages.  All messages
  147.       originating on the Internet side are forwarded to our USENET
  148.       machine.  They are then posted to the appropriate newsgroup.
  149.       Unfortunately, for gatewayed messages, the sender becomes
  150.       "news@brl-adm".  This is currently an unavoidable side-effect of
  151.       the software which performs the gateway function.
  152.  
  153.       As for readership, USENET has an extremely large readership - I
  154.       would guess several thousand hosts and tens of thousands of
  155.       readers.  The master list maintained here at BRL runs about two
  156.       hundred fifty entries with roughly ten percent of those being
  157.       local redistribution lists.  I don't have a good feel for the
  158.       size of the BITNET redistribution, but I would guess it is
  159.       roughly the same size and composition as the master list.
  160.       Traffic runs 150K to 400K bytes per list per week on average.
  161.  
  162. 1.5)  What are some useful Unix or C books?
  163.  
  164.       Mitch Wright (mitch@cirrus.com) maintains a useful list of Unix
  165.       and C books, with descriptions and some mini-reviews.  There are
  166.       currently 77 titles on his list.
  167.  
  168.       You can obtain a copy of this list by anonymous ftp from
  169.       ftp.wg.omron.co.jp (133.210.4.4), where it's
  170.       "pub/unix-faq/docs/Unix-C-Booklist".  If you can't use anonymous
  171.       ftp, email the line "help" to "mailserv@iuvax.cs.indiana.edu" for
  172.       instructions on retrieving things via email.
  173.  
  174.       Send additions or suggestions to mitch@cirrus.com.
  175.  
  176. 1.6)  What happened to the pronunciation list that used to be part of this
  177.       document?
  178.  
  179.       From its inception in 1989, this FAQ document included a
  180.       comprehensive pronunciation list maintained by Maarten Litmaath
  181.       (thanks, Maarten!).  (Does anyone know who *created* it?)
  182.  
  183.       It has been retired, since it is not really relevant to the topic
  184.       of "Unix questions".  You can still find it as part of the
  185.       widely-distributed "Jargon" file (maintained by Eric S. Raymond,
  186.       eric@snark.thyrsus.com) which seems like a much more appropriate
  187.       forum for the topic of "How do you pronounce  /* ?"
  188.  
  189.       If you'd like a copy, you can ftp one from ftp.wg.omron.co.jp
  190.       (133.210.4.4), it's "pub/unix-faq/docs/Pronunciation-Guide".
  191.  
  192. --
  193. Ted Timar - tmatimar@empress.com
  194. Empress Software, 3100 Steeles Ave E, Markham, Ont., Canada L3R 8T3
  195. Xref: bloom-picayune.mit.edu comp.unix.questions:51338 comp.unix.shell:8344 news.answers:4780
  196. Path: bloom-picayune.mit.edu!senator-bedfellow.mit.edu!senator-bedfellow.mit.edu!usenet
  197. From: tmatimar@empress.com (Ted M A Timar)
  198. Newsgroups: comp.unix.questions,comp.unix.shell,news.answers
  199. Subject: Unix - Frequently Asked Questions (2/7) [Frequent posting]
  200. Supersedes: <unix-faq/faq/part2_723967331@athena.mit.edu>
  201. Followup-To: comp.unix.questions
  202. Date: 24 Dec 1992 06:03:20 GMT
  203. Organization: Empress Software
  204. Lines: 837
  205. Approved: news-answers-request@MIT.Edu
  206. Distribution: world
  207. Expires: 21 Jan 1993 06:02:09 GMT
  208. Message-ID: <unix-faq/faq/part2_725176929@athena.mit.edu>
  209. References: <unix-faq/faq/contents_725176929@athena.mit.edu>
  210. NNTP-Posting-Host: pit-manager.mit.edu
  211. X-Last-Updated: 1992/12/09
  212.  
  213. Archive-name: unix-faq/faq/part2
  214. Version: $Id: part2,v 2.1 92/12/04 07:43:45 tmatimar Exp $
  215.  
  216. These seven articles contain the answers to some Frequently Asked
  217. Questions often seen in comp.unix.questions and comp.unix.shell.
  218. Please don't ask these questions again, they've been answered plenty
  219. of times already - and please don't flame someone just because they may
  220. not have read this particular posting.  Thank you.
  221.  
  222. These articles are divided approximately as follows:
  223.  
  224.       1.*) General questions.
  225.       2.*) Relatively basic questions, likely to be asked by beginners.
  226.       3.*) Intermediate questions.
  227.       4.*) Advanced questions, likely to be asked by people who thought
  228.        they already knew all of the answers.
  229.       5.*) Questions pertaining to the various shells, and the differences.
  230.       6.*) An overview of Unix variants.
  231.       7.*) An comparison of configuration management systems (RCS, SCCS).
  232.  
  233. This article includes answers to:
  234.  
  235.       2.1)  How do I remove a file whose name begins with a "-" ?
  236.       2.2)  How do I remove a file with funny characters in the filename ?
  237.       2.3)  How do I get a recursive directory listing?
  238.       2.4)  How do I get the current directory into my prompt?
  239.       2.5)  How do I read characters from the terminal in a shell script?
  240.       2.6)  How do I rename "*.foo" to "*.bar", or change file names
  241.               to lowercase?
  242.       2.7)  Why do I get [some strange error message] when I
  243.               "rsh host command" ?
  244.       2.8)  How do I {set an environment variable, change directory} inside a
  245.               program or shell script and have that change affect my
  246.               current shell?
  247.       2.9)  How do I redirect stdout and stderr separately in csh?
  248.       2.10) How do I tell inside .cshrc if I'm a login shell?
  249.       2.11) How do I construct a shell glob-pattern that matches all files
  250.             except "." and ".." ?
  251.       2.12) How do I find the last argument in a Bourne shell script?
  252.       2.13) What's wrong with having '.' in your $PATH ?
  253.  
  254. If you're looking for the answer to, say, question 2.5, and want to skip
  255. everything else, you can search ahead for the regular expression "^2.5)".
  256.  
  257. While these are all legitimate questions, they seem to crop up in
  258. comp.unix.questions or comp.unix.shell on an annual basis, usually
  259. followed by plenty of replies (only some of which are correct) and then
  260. a period of griping about how the same questions keep coming up.  You
  261. may also like to read the monthly article "Answers to Frequently Asked
  262. Questions" in the newsgroup "news.announce.newusers", which will tell
  263. you what "UNIX" stands for.
  264.  
  265. With the variety of Unix systems in the world, it's hard to guarantee
  266. that these answers will work everywhere.  Read your local manual pages
  267. before trying anything suggested here.  If you have suggestions or
  268. corrections for any of these answers, please send them to to
  269. tmatimar@empress.com.
  270.  
  271. 2.1)  How do I remove a file whose name begins with a "-" ?
  272.  
  273.       Figure out some way to name the file so that it doesn't begin
  274.       with a dash.  The simplest answer is to use
  275.  
  276.         rm ./-filename
  277.  
  278.       (assuming "-filename" is in the current directory, of course.)
  279.       This method of avoiding the interpretation of the "-" works with
  280.       other commands too.
  281.  
  282.       Many commands, particularly those that have been written to use
  283.       the "getopt(3)" argument parsing routine, accept a "--" argument
  284.       which means "this is the last option, anything after this is not
  285.       an option", so your version of rm might handle "rm -- -filename".
  286.       Some versions of rm that don't use getopt() treat a single "-"
  287.       in the same way, so you can also try "rm - -filename".
  288.  
  289. 2.2)  How do I remove a file with funny characters in the filename ?
  290.  
  291.       If the 'funny character' is a '/', skip to the last part of this
  292.       answer.  If the funny character is something else, such as a ' '
  293.       or control character or character with the 8th bit set, keep reading.
  294.  
  295.       The classic answers are
  296.  
  297.     rm -i some*pattern*that*matches*only*the*file*you*want
  298.  
  299.     which asks you whether you want to remove each file matching
  300.     the indicated pattern;  depending on your shell, this may not
  301.     work if the filename has a character with the 8th bit set (the
  302.     shell may strip that off);
  303.  
  304.       and
  305.  
  306.     rm -ri .
  307.  
  308.     which asks you whether to remove each file in the directory.
  309.     Answer "y" to the problem file and "n" to everything else.
  310.     Unfortunately this doesn't work with many versions of rm.  Also
  311.     unfortunately, this will walk through every subdirectory of ".",
  312.     so you might want to "chmod a-x" those directories temporarily
  313.     to make them unsearchable.
  314.  
  315.     Always take a deep breath and think about what you're doing and
  316.     double check what you typed when you use rm's "-r" flag or a
  317.     wildcard on the command line;
  318.  
  319.       and
  320.  
  321.     find . -type f ... -ok rm '{}' \;
  322.  
  323.       where "..." is a group of predicates that uniquely identify the
  324.       file.  One possibility is to figure out the inode number of the
  325.       problem file (use "ls -i .") and then use
  326.  
  327.     find . -inum 12345 -ok rm '{}' \;
  328.  
  329.       or
  330.     find . -inum 12345 -ok mv '{}' new-file-name \;
  331.     
  332.       "-ok" is a safety check - it will prompt you for confirmation of
  333.       the command it's about to execute.  You can use "-exec" instead
  334.       to avoid the prompting, if you want to live dangerously, or if
  335.       you suspect that the filename may contain a funny character
  336.       sequence that will mess up your screen when printed.
  337.  
  338.       What if the filename has a '/' in it?
  339.  
  340.       These files really are special cases, and can only be created by
  341.       buggy kernel code (typically by implementations of NFS that don't
  342.       filter out illegal characters in file names from remote
  343.       machines.)  The first thing to do is to try to understand exactly
  344.       why this problem is so strange.
  345.  
  346.       Recall that Unix directories are simply pairs of filenames and
  347.       inode numbers.  A directory essentially contains information
  348.       like this:
  349.  
  350.     filename  inode
  351.  
  352.     file1      12345
  353.     file2.c      12349
  354.     file3     12347
  355.  
  356.       Theoretically, '/' and '\0' are the only two characters that
  357.       cannot appear in a filename - '/' because it's used to separate
  358.       directories and files, and '\0' because it terminates a filename.
  359.  
  360.       Unfortunately some implementations of NFS will blithely create
  361.       filenames with embedded slashes in response to requests from
  362.       remote machines.  For instance, this could happen when someone on
  363.       a Mac or other non-Unix machine decides to create a remote NFS
  364.       file on your Unix machine with the date in the filename.  Your
  365.       Unix directory then has this in it:
  366.  
  367.     filename  inode
  368.  
  369.     91/02/07  12357
  370.  
  371.       No amount of messing around with 'find' or 'rm' as described
  372.       above will delete this file, since those utilities and all other
  373.       Unix programs, are forced to interpret the '/' in the normal way.
  374.  
  375.       Any ordinary program will eventually try to do
  376.       unlink("91/02/07"), which as far as the kernel is concerned means
  377.       "unlink the file 07 in the subdirectory 02 of directory 91", but
  378.       that's not what we have - we have a *FILE* named "91/02/07" in
  379.       the current directory.  This is a subtle but crucial distinction.
  380.  
  381.       What can you do in this case?  The first thing to try is to
  382.       return to the Mac that created this crummy entry, and see if you
  383.       can convince it and your local NFS daemon to rename the file to
  384.       something without slashes.
  385.  
  386.       If that doesn't work or isn't possible, you'll need help from
  387.       your system manager, who will have to try the one of the
  388.       following.  Use "ls -i" to find the inode number of this bogus
  389.       file, then unmount the file system and use "clri" to clear the
  390.       inode, and "fsck" the file system with your fingers crossed.
  391.       This destroys the information in the file.  If you want to keep
  392.       it, you can try:
  393.  
  394.     create a new directory in the same parent directory as the one
  395.     containing the bad file name;
  396.  
  397.     move everything you can (i.e. everything but the file with the
  398.     bad name) from the old directory to the new one;
  399.  
  400.     do "ls -id" on the directory containing the file with the bad
  401.     name to get its inumber;
  402.  
  403.     umount the file system;
  404.  
  405.     "clri" the directory containing the file with the bad name;
  406.  
  407.     "fsck" the file system.
  408.  
  409.       Then, to find the file,
  410.  
  411.     remount the file system;
  412.  
  413.     rename the directory you created to have the name of the old
  414.     directory (since the old directory should have been blown away
  415.     by "fsck")
  416.  
  417.     move the file out of "lost+found" into the directory with a
  418.     better name.
  419.  
  420.       Alternatively, you can patch the directory the hard way by
  421.       crawling around in the raw file system.  Use "fsdb", if you
  422.       have it.
  423.  
  424. 2.3)  How do I get a recursive directory listing?
  425.  
  426.       One of the following may do what you want:
  427.  
  428.     ls -R             (not all versions of "ls" have -R)
  429.     find . -print        (should work everywhere)
  430.     du -a .            (shows you both the name and size)
  431.  
  432.       If you're looking for a wildcard pattern that will match all ".c"
  433.       files in this directory and below, you won't find one, but you
  434.       can use
  435.  
  436.     % some-command `find . -name '*.c' -print`
  437.  
  438.       "find" is a powerful program.  Learn about it.
  439.  
  440. 2.4)  How do I get the current directory into my prompt?
  441.  
  442.       It depends which shell you are using.  It's easy with some
  443.       shells, hard or impossible with others.
  444.  
  445.       C Shell (csh):
  446.     Put this in your .cshrc - customize the prompt variable the
  447.     way you want.
  448.  
  449.         alias setprompt 'set prompt="${cwd}% "'
  450.         setprompt        # to set the initial prompt
  451.         alias cd 'chdir \!* && setprompt'
  452.     
  453.     If you use pushd and popd, you'll also need
  454.  
  455.         alias pushd 'pushd \!* && setprompt'
  456.         alias popd  'popd  \!* && setprompt'
  457.  
  458.     Some C shells don't keep a $cwd variable - you can use
  459.     `pwd` instead.
  460.  
  461.     If you just want the last component of the current directory
  462.     in your prompt ("mail% " instead of "/usr/spool/mail% ")
  463.     you can use
  464.  
  465.         alias setprompt 'set prompt="$cwd:t% "'
  466.     
  467.     Some older csh's get the meaning of && and || reversed.
  468.     Try doing:
  469.  
  470.         false && echo bug
  471.  
  472.     If it prints "bug", you need to switch && and || (and get
  473.     a better version of csh.)
  474.  
  475.       Bourne Shell (sh):
  476.  
  477.     If you have a newer version of the Bourne Shell (SVR2 or newer)
  478.     you can use a shell function to make your own command, "xcd" say:
  479.  
  480.         xcd() { cd $* ; PS1="`pwd` $ "; }
  481.  
  482.     If you have an older Bourne shell, it's complicated but not
  483.     impossible.  Here's one way.  Add this to your .profile file:
  484.  
  485.         LOGIN_SHELL=$$ export LOGIN_SHELL
  486.         CMDFILE=/tmp/cd.$$ export CMDFILE
  487.         # 16 is SIGURG, pick a signal that's not likely to be used
  488.         PROMPTSIG=16 export PROMPTSIG
  489.         trap '. $CMDFILE' $PROMPTSIG
  490.  
  491.     and then put this executable script (without the indentation!),
  492.     let's call it "xcd", somewhere in your PATH
  493.  
  494.         : xcd directory - change directory and set prompt
  495.         : by signalling the login shell to read a command file
  496.         cat >${CMDFILE?"not set"} <<EOF
  497.         cd $1
  498.         PS1="\`pwd\`$ "
  499.         EOF
  500.         kill -${PROMPTSIG?"not set"} ${LOGIN_SHELL?"not set"}
  501.  
  502.     Now change directories with "xcd /some/dir".
  503.  
  504.       Korn Shell (ksh):
  505.  
  506.     Put this in your .profile file:
  507.         PS1='$PWD $ '
  508.     
  509.     If you just want the last component of the directory, use
  510.         PS1='${PWD##*/} $ '
  511.  
  512.       T C shell (tcsh)
  513.  
  514.     Tcsh is a popular enhanced version of csh with some extra
  515.     builtin variables (and many other features):
  516.  
  517.         %~        the current directory, using ~ for $HOME
  518.         %d or %/    the full pathname of the current directory
  519.         %c or %.    the trailing component of the current directory
  520.  
  521.     so you can do
  522.  
  523.         set prompt='%~ '
  524.  
  525.       BASH (FSF's "Bourne Again SHell")
  526.     
  527.     \w in $PS1 gives the full pathname of the current directory,
  528.     with ~ expansion for $HOME;  \W gives the basename of
  529.     the current directory.  So, in addition to the above sh and
  530.     ksh solutions, you could use
  531.  
  532.         PS1='\w $ '    
  533.     or
  534.         PS1='\W $ '
  535.  
  536. 2.5)  How do I read characters from the terminal in a shell script?
  537.  
  538.       In sh, use read.  It is most common to use a loop like
  539.  
  540.         while read line
  541.         do
  542.             ...
  543.         done
  544.  
  545.       In csh, use $< like this:
  546.     
  547.         while ( 1 )
  548.         set line = "$<"
  549.         if ( "$line" == "" ) break
  550.         ...
  551.         end
  552.  
  553.       Unfortunately csh has no way of distinguishing between a blank
  554.       line and an end-of-file.
  555.  
  556.       If you're using sh and want to read a *single* character from the
  557.       terminal, you can try something like
  558.  
  559.         echo -n "Enter a character: "
  560.         stty cbreak        # or  stty raw
  561.         readchar=`dd if=/dev/tty bs=1 count=1 2>/dev/null`
  562.         stty -cbreak
  563.  
  564.         echo "Thank you for typing a $readchar ."
  565.  
  566. 2.6)  How do I rename "*.foo" to "*.bar", or change file names to lowercase?
  567.     
  568.       Why doesn't "mv *.foo *.bar" work?  Think about how the shell
  569.       expands wildcards.   "*.foo" and "*.bar" are expanded before the
  570.       mv command ever sees the arguments.  Depending on your shell,
  571.       this can fail in a couple of ways.  CSH prints "No match."
  572.       because it can't match "*.bar".  SH executes "mv a.foo b.foo
  573.       c.foo *.bar", which will only succeed if you happen to have a
  574.       single directory named "*.bar", which is very unlikely and almost
  575.       certainly not what you had in mind.
  576.  
  577.       Depending on your shell, you can do it with a loop to "mv" each
  578.       file individually.  If your system has "basename", you can use:
  579.  
  580.       C Shell:
  581.     foreach f ( *.foo )
  582.         set base=`basename $f .foo`
  583.         mv $f $base.bar
  584.     end
  585.  
  586.       Bourne Shell:
  587.     for f in *.foo; do
  588.         base=`basename $f .foo`
  589.         mv $f $base.bar
  590.     done
  591.  
  592.       Some shells have their own variable substitution features, so
  593.       instead of using "basename", you can use simpler loops like:
  594.  
  595.       C Shell:
  596.  
  597.     foreach f ( *.foo )
  598.         mv $f $f:r.bar
  599.     end
  600.  
  601.       Korn Shell:
  602.  
  603.     for f in *.foo; do
  604.         mv $f ${f%foo}bar
  605.     done
  606.  
  607.       If you don't have "basename" or want to do something like
  608.       renaming foo.* to bar.*, you can use something like "sed" to
  609.       strip apart the original file name in other ways, but the general
  610.       looping idea is the same.  You can also convert file names into
  611.       "mv" commands with 'sed', and hand the commands off to "sh" for
  612.       execution.  Try
  613.  
  614.     ls -d *.foo | sed -e 's/.*/mv & &/' -e 's/foo$/bar/' | sh
  615.  
  616.       A program by Vladimir Lanin called "mmv" that does this job
  617.       nicely was posted to comp.sources.unix (Volume 21, issues 87 and
  618.       88) in April 1990.  It lets you use
  619.  
  620.     mmv '*.foo' '=1.bar'
  621.  
  622.       Shell loops like the above can also be used to translate file
  623.       names from upper to lower case or vice versa.  You could use
  624.       something like this to rename uppercase files to lowercase:
  625.  
  626.     C Shell:
  627.         foreach f ( * )
  628.         mv $f `echo $f | tr '[A-Z]' '[a-z]'`
  629.         end
  630.     Bourne Shell:
  631.         for f in *; do
  632.         mv $f `echo $f | tr '[A-Z]' '[a-z]'`
  633.         done
  634.     Korn Shell:
  635.         typeset -l l
  636.         for f in *; do
  637.         l="$f"
  638.         mv $f $l
  639.         done
  640.  
  641.       If you wanted to be really thorough and handle files with `funny'
  642.       names (embedded blanks or whatever) you'd need to use
  643.  
  644.     Bourne Shell:
  645.  
  646.         for f in *; do
  647.           g=`expr "xxx$f" : 'xxx\(.*\)' | tr '[A-Z]' '[a-z]'`
  648.           mv "$f" "$g"
  649.         done
  650.  
  651.       The `expr' command will always print the filename, even if it
  652.       equals `-n' or if it contains a System V escape sequence like `\c'.
  653.  
  654.       Some versions of "tr" require the [ and ], some don't.  It
  655.       happens to be harmless to include them in this particular
  656.       example; versions of tr that don't want the [] will conveniently
  657.       think they are supposed to translate '[' to '[' and ']' to ']'.
  658.  
  659.       If you have the "perl" language installed, you may find this
  660.       rename script by Larry Wall very useful.  It can be used to
  661.       accomplish a wide variety of filename changes.
  662.  
  663.     #!/usr/bin/perl
  664.     #
  665.     # rename script examples from lwall:
  666.     #       rename 's/\.orig$//' *.orig
  667.     #       rename 'y/A-Z/a-z/ unless /^Make/' *
  668.     #       rename '$_ .= ".bad"' *.f
  669.     #       rename 'print "$_: "; s/foo/bar/ if <stdin> =~ /^y/i' *
  670.  
  671.     $op = shift;
  672.     for (@ARGV) {
  673.         $was = $_;
  674.         eval $op;
  675.         die $@ if $@;
  676.         rename($was,$_) unless $was eq $_;
  677.     }
  678.  
  679. 2.7)  Why do I get [some strange error message] when I "rsh host command" ?
  680.  
  681.       (We're talking about the remote shell program "rsh" or sometimes
  682.       "remsh" or "remote"; on some machines, there is a restricted shell
  683.       called "rsh", which is a different thing.)
  684.  
  685.       If your remote account uses the C shell, the remote host will
  686.       fire up a C shell to execute 'command' for you, and that shell
  687.       will read your remote .cshrc file.  Perhaps your .cshrc contains
  688.       a "stty", "biff" or some other command that isn't appropriate for
  689.       a non-interactive shell.  The unexpected output or error message
  690.       from these commands can screw up your rsh in odd ways.
  691.  
  692.       Here's an example.  Suppose you have
  693.  
  694.     stty erase ^H
  695.     biff y
  696.  
  697.       in your .cshrc file.  You'll get some odd messages like this.
  698.  
  699.     % rsh some-machine date
  700.     stty: : Can't assign requested address
  701.     Where are you?
  702.     Tue Oct  1 09:24:45 EST 1991
  703.  
  704.       You might also get similar errors when running certain "at" or
  705.       "cron" jobs that also read your .cshrc file.
  706.  
  707.       Fortunately, the fix is simple.  There are, quite possibly, a
  708.       whole *bunch* of operations in your ".cshrc" (e.g., "set
  709.       history=N") that are simply not worth doing except in interactive
  710.       shells.  What you do is surround them in your ".cshrc" with:
  711.  
  712.         if ( $?prompt ) then
  713.             operations....
  714.         endif
  715.  
  716.       and, since in a non-interactive shell "prompt" won't be set, the
  717.       operations in question will only be done in interactive shells.
  718.  
  719.       You may also wish to move some commands to your .login file; if
  720.       those commands only need to be done when a login session starts
  721.       up (checking for new mail, unread news and so on) it's better to
  722.       have them in the .login file.
  723.  
  724. 2.8)  How do I {set an environment variable, change directory} inside
  725.       a program or shell script and have that change affect my
  726.       current shell?
  727.  
  728.       In general, you can't, at least not without making special
  729.       arrangements.  When a child process is created, it inherits a
  730.       copy of its parent's variables (and current directory).  The
  731.       child can change these values all it wants but the changes won't
  732.       affect the parent shell, since the child is changing a copy of
  733.       the original data.
  734.  
  735.       Some special arrangements are possible.  Your child process could
  736.       write out the changed variables, if the parent was prepared to
  737.       read the output and interpret it as commands to set its own
  738.       variables.
  739.  
  740.       Also, shells can arrange to run other shell scripts in the
  741.       context of the current shell, rather than in a child process, so
  742.       that changes will affect the original shell.
  743.  
  744.       For instance, if you have a C shell script named "myscript":
  745.  
  746.     cd /very/long/path
  747.     setenv PATH /something:/something-else
  748.  
  749.       or the equivalent Bourne or Korn shell script
  750.  
  751.     cd /very/long/path
  752.     PATH=/something:/something-else export PATH
  753.  
  754.       and try to run "myscript" from your shell, your shell will fork
  755.       and run the shell script in a subprocess.  The subprocess is also
  756.       running the shell; when it sees the "cd" command it changes *its*
  757.       current directory, and when it sees the "setenv" command it
  758.       changes *its* environment, but neither has any effect on the
  759.       current directory of the shell at which you're typing (your login
  760.       shell, let's say).
  761.